利用extension简化代码

Swift 减少了冗余度,因为枚举值可以在类型名之后加上点语法进行访问,即使你省略掉了类型姓名它仍然能够推断出来:

label.textAlignment = NSTextAlignment.Center

// 更为简洁:

label.textAlignment = .Center

然而,很多时候我们很可能不会用到枚举,遇上的往往是这样很长很长的一个构造器:

animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)

代码中会有多少个“timingFunction”?很可能多到无法想象。

有一个不为人知的小技巧,就是缩略形式的点语法对于所有类型的静态成员来说都是有效的。通过在扩展中增加自定义的属性就可以应用上这个技巧了……

extension CAMediaTimingFunction
{
    // 这个属性是懒加载属性,第一次被访问时才会被初始化。
    // (@nonobjc 标记是必须的,这可以阻止编译器试图为一个
    //  静态属性创建动态访问器(也就是令其不可继承)。
    @nonobjc static let EaseInEaseOut = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)

    // 另一个方法就是使用计算性属性,这也同样有效,
    // 但是*每次*访问它的时候都将重新计算,可能带来性能问题:
    static var EaseInEaseOut: CAMediaTimingFunction {
        // .init is short for self.init
        return .init(name: kCAMediaTimingFunctionEaseInEaseOut)
    }
}

这样我们就可以很方便地简化这个操作了:

animation.timingFunction = .EaseInEaseOut

上下文环境 处理 Core Graphics 上下文、色区之类的代码同样也会非常非常长:

CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),
    CGColorCreate(CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB), [0.792, 0.792, 0.816, 1]))

我们仍然使用万能的扩展:

extension CGContext
{
    static func currentContext() -> CGContext? {
        return UIGraphicsGetCurrentContext()
    }
}

extension CGColorSpace
{
    static let GenericRGB = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)
}

CGContextSetFillColorWithColor(.currentContext(),
    CGColorCreate(.GenericRGB, [0.792, 0.792, 0.816, 1]))

看起来要简单不少。当然,还有很多方法可以扩展 Core Graphics,从而让它符合您的需求。

results matching ""

    No results matching ""